/******************************************************************
 * 作者：sipeiliu
 * 邮箱：sipeiliu@163.com
 * 描述：键盘控制电机
 * 日期：2023.4.10
 ******************************************************************/

#include "/opt/sighter/inc/motor.h"
#include "/opt/sighter/inc/key.h"

#include <stdio.h>
#include <termios.h>
#include <unistd.h>

/*监听键盘事件（按下键盘的时候程序立刻读取）*/
static char monitor_keyboard()
{
    char key_in; // 输入
    struct termios new_set;
    struct termios old_set;

    tcgetattr(0, &old_set); // 读取标准输入终端的原始配置信息
    new_set = old_set;
    new_set.c_lflag &= (~ICANON);    // 非规范模式
    new_set.c_cc[VTIME] = 0;         // 超时时间
    new_set.c_cc[VMIN] = 1;          // 最少读取的字符数
    tcsetattr(0, TCSANOW, &new_set); // 设置新的配置信息
    key_in = getchar();
    tcsetattr(0, TCSANOW, &old_set); // 恢复原始配置信息
    return key_in;
}

/*键盘控制电机转向*/
void *thread_key(void *arg)
{
    char key_out; // 读取

    while (1)
    {
        key_out = monitor_keyboard(); // 监听键盘
        // 从标准输入读取字符
        switch (key_out)
        {
        // 停止
        case 'P':
        case 'p':
            motor_run(STOP);
            break;
        // 向前
        case 'W':
        case 'w':
            motor_run(FORWARD);
            motor_run(STOP);
            break;
        // 向后
        case 'S':
        case 's':
            motor_run(BACKWARD);
            motor_run(STOP);
            break;
        // 向左
        case 'A':
        case 'a':
            motor_run(LEFT);
            motor_run(STOP);
        // 向右
        case 'D':
        case 'd':
            motor_run(RIGHT);
            motor_run(STOP);
        // 顺时针
        case 'E':
        case 'e':
            motor_run(CLOCKWISE);
            motor_run(STOP);
        // 逆时针
        case 'Q':
        case 'q':
            motor_run(ANTICLOCKWISE);
            motor_run(STOP);
        }
    }
}